import { ref, reactive, type Ref } from 'vue';

/**
 * 分页结果接口
 * @template T - 数据项类型
 * @template U - 处理后数据项类型，默认与T相同
 */
interface UsePaginationResult<T, U = T> {
	/** 当前页码 */
	currentPage : Ref<number>;
	/** 分页数据列表 */
	dataList : Ref<Array<U>>;
	/** 是否正在加载 */
	isLoading : Ref<boolean>;
	/** 初始化获取第一页数据 */
	initFetch : () => Promise<void>;
	/** 请求下一页数据 */
	fetchNextPage : () => Promise<void>;
	/** 设置额外参数 */
	setExtraParams : (params : Record<string, unknown>) => void;
}



/**
 * 数据处理器类型
 * @template T - 输入数据项类型
 * @template U - 输出数据项类型
 */
type DataProcessor<T, U> = (list : Array<T>) => Array<U>;

/**
 * 使用分页的函数
 * @template T - 数据项类型
 * @template U - 处理后数据项类型，默认与T相同
 * @param apiFunc - API回调函数
 * @param pageSize - 每页大小，默认为10
 * @param dataProcessor - 数据处理器，用于处理API返回的list数据，可选
 * @returns 分页结果对象
 */
export default function usePagination<T, U = T>(
	apiFunc : (params : PageListBaseRequest & { [key : string] : unknown }) => Promise<PageListBaseResponse<T>>,
	pageSize : number = 10,
	dataProcessor : DataProcessor<T, U> = (items : Array<T>) => items as unknown as Array<U>
) : UsePaginationResult<T, U> {
	// 是否正在加载
	const isLoading = ref(false);
	// 当前页码
	const currentPage = ref(1);
	// 分页大小
	const size = ref(pageSize);
	// 总页数（在首次请求时获取）
	const totalPages = ref(0);
	// 分页数据
	const dataList : Ref<Array<U>> = ref([]);
	// 额外参数，使用ref创建可响应对象
	let extraParams = ref({});

	/**
	 * 设置额外参数
	 * @param newParams - 新的额外参数，将完全覆写现有额外参数
	 */
	const setExtraParams = (newParams : Record<string, unknown>) => {
		extraParams.value = newParams;
	};

	/**
	 * 初始化获取第一页数据
	 */
	const initFetch = async () : Promise<void> => {
		if (isLoading.value) return;
		isLoading.value = true;
		dataList.value = [];
		currentPage.value = 1;
		try {
			const response = await apiFunc({ page: currentPage.value, size: size.value, ...extraParams.value });
			const processedList : Array<U> = dataProcessor(response.list) as Array<U>;
			dataList.value = processedList || [];
			totalPages.value = Math.ceil(response.total / size.value);

		} catch (err) {
			console.error("initFetch error:", err);
		} finally {
			isLoading.value = false;
		}
	};

	/**
	 * 请求下一页数据
	 */
	const fetchNextPage = async () : Promise<void> => {
		if (isLoading.value || currentPage.value >= totalPages.value) return;
		isLoading.value = true;

		try {
			const response = await apiFunc({ page: currentPage.value + 1, size: size.value, ...extraParams.value });
			const processedList : Array<U> = dataProcessor(response.list) as Array<U>;
			dataList.value.push(...processedList);
			currentPage.value++;

		} catch (err) {
			console.error("fetchNextPage error:", err);
		} finally {
			isLoading.value = false;
		}
	};
	return {
		currentPage,
		dataList,
		isLoading,
		initFetch,
		fetchNextPage,
		setExtraParams,
	};
}